package com.yc.d0725;

import java.lang.reflect.Constructor;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.HashMap;

public class 反射 {

    public static void main(String[] args) throws Exception {
        test(new ArrayList<String>());
        test(new HashMap<String,Object>());
    }

    public static void test(Object obj) throws Exception{
        System.out.println(obj.getClass());

        // 反射执行方法
        if(obj.getClass() == HashMap.class){
            Class<HashMap> cls = (Class<HashMap>) obj.getClass();
            cls.getMethods();            // 获取类公有所有的方法        public
            cls.getDeclaredMethods();  // 获取类所有的定义的方法 :1.当前类定义的方法 , 2.从父类继承的
            cls.getSuperclass();       // 获取父类对象
            Method m = cls.getMethod("put",Object.class, Object.class); // 或某一个指定的公有方法
            // cls.getDeclaredMethod();    // 或某一个指定的类定义的方法
            m.invoke(obj, "name1", "zhangsan");
            m.invoke(obj, "name2", "lisi");

            m = cls.getMethod("get", Object.class);

            System.out.println(m.invoke(obj, "name2"));
            System.out.println(m.invoke(obj, "name3"));

        } else if(obj.getClass() == ArrayList.class){
            Class<ArrayList> cls = (Class<ArrayList>) obj.getClass();
            // 通过类对象创建对象, 方法一:
            ArrayList list = cls.newInstance();  // ==> new ArrayList();
            System.out.println(list.size());
            // 通过类对象创建对象, 方法二:
            Constructor<ArrayList> cons = cls.getDeclaredConstructor(int.class);
            list = cons.newInstance(100);  // ==> new ArrayList(100);

            list.add("abc");
            list.add("123");
            System.out.println(list);
        }


    }

}
